import path from "path";
import {PagesOptions} from "../types";
import fs from "fs";
import {DefaultPagesJson} from "../constant";

export class PagesJsonHelper {

    /**
     * Unicode字符转换为转义字符串的辅助函数
     * @param obj 要处理的对象
     * @returns 处理后的对象
     */
    private static convertUnicodeCharsToEscapeStrings(obj: any): any {
        if (typeof obj === 'string') {
            // 检查字符串是否包含Unicode字符（字符码 > 127 且可能是图标字符）
            let result = '';
            for (let i = 0; i < obj.length; i++) {
                const charCode = obj.charCodeAt(i);
                // 检查是否是可能的图标字符范围（通常在私有使用区域）
                if (charCode >= 0xE000 && charCode <= 0xF8FF) {
                    // 转换为\u转义格式
                    result += '\\u' + charCode.toString(16).toLowerCase().padStart(4, '0');
                } else {
                    result += obj.charAt(i);
                }
            }
            return result;
        } else if (Array.isArray(obj)) {
            return obj.map(item => this.convertUnicodeCharsToEscapeStrings(item));
        } else if (obj && typeof obj === 'object') {
            const result: any = {};
            for (const key in obj) {
                if (obj.hasOwnProperty(key)) {
                    result[key] = this.convertUnicodeCharsToEscapeStrings(obj[key]);
                }
            }
            return result;
        }
        return obj;
    }

    /**
     * 写入 pages.json 文件
     * @param outputPath 输出目录
     * @param pagesJson pages.json 内容
     */
    public static write(outputPath: string, pagesJson: PagesOptions): void {
        // 先转换Unicode字符为转义字符串
        const convertedConfig = this.convertUnicodeCharsToEscapeStrings(pagesJson);

        let content = JSON.stringify(convertedConfig, null, 4);

        // 修复JSON.stringify对转义字符的处理
        content = content.replace(/\\\\u([0-9a-fA-F]{4})/g, '\\u$1');

        // 确保输出目录存在
        const outputDir = path.dirname(outputPath);
        if (!fs.existsSync(outputDir)) {
            fs.mkdirSync(outputDir, {recursive: true});
        }

        fs.writeFileSync(outputPath, content, 'utf-8');
    }

    /**
     * 生成默认的 pages.json，如果存在则不覆盖
     * @param outputPath 输出目录
     */
    public static generateDefault(outputPath: string) {
        if (!fs.existsSync(outputPath)) {
            PagesJsonHelper.write(outputPath, DefaultPagesJson);
        }
    }
}
